#!/bin/bash
##########批量下载指定目录hdfs文件########
#eg:下载单个目录，单线程
#  sudo sh sftp_download.sh  -v qingbo -p share -s xiaohongshu.com -d 20230716 -t data -l /data/lixinpeng
# eg2:下载多个日期目录，一个目录一个线程。下载20230407和20230501
#  sudo sh sftp_download.sh  -v qingbo -p share -s xiaohongshu.com -d 20230407,20230501 -t data -l /data/lixinpeng
#####################################
concurrentHandle() {
  #并发控制
  [ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道
  exec 3<>/tmp/fd1                   #创建文件描述符，以可读（<）可写（>）的方式关联管道文件，这时候文件描述符3就有了有名管道文件的所有特性
  rm -rf /tmp/fd1                    #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除，我们留下文件描述符来用就可以了
  for ((i = 1; i <= 2; i++)); do #线程数据3
    echo >&3 #&3代表引用文件描述符3，这条命令代表往管道里面放入了一个"令牌"
  done
}
check_dst_dir() {
  #判断本地目录是否存在，不存在则创建
  #下载文件到本地目录
  local_dir=$l_path/$s_v/$s_p/$s_s/$currentDir/
  echo $local_dir
  if [ ! -d $local_dir/"zip" ]; then
    mkdir -p $local_dir/"zip"
    mkdir -p $local_dir/"unzip"
  fi
}
#下载目录
function download_dir() {
  src_dir=/$s_v/"regulation"/$currentDir/$s_p/$s_s
  echo "下载目录:" $src_dir
  lftp -u ${USER},${PASSWORD} sftp://${IP}:${PORT} <<EOF
        #下载到指定目录
        lcd ${local_dir}/zip
        mget ${src_dir}/*$s_t*
        by
EOF
}
#解压
function doUnZip() {
  zip_dir=$local_dir"/zip"
  unzip_dir=$local_dir"/unzip"
  zip_files=$(ls $zip_dir)
  for file in $zip_files; do
    zip_file=$zip_dir"/$file"
    echo "解压目录:" $zip_file
    $(unzip -d $unzip_dir $zip_file) >/dev/null 2>&1
  done
}
#用户名
USER=social_cd
#密码
PASSWORD=aRs0nWllq61
#IP
IP=dts-nb.mininglamp.com
#端口
PORT=2222
#执行结束时间
startTime=$(date +%Y%m%d-%H:%M:%S)
startTime_s=$(date +%s)

#供应商 平台 数据源 日期 类型

 #供应商 平台 数据源 日期 类型
  #参数转换
  while getopts ":v:p:s:d:t:l:" opt; do
    case $opt in
    v)
      echo "this is vendor arg, -v    "$OPTARG
      s_v=$OPTARG
      ;;
    p)
      echo "this is platform arg, -p    "$OPTARG
      s_p=$OPTARG
      ;;
    s)
      echo "this is source arg, -s    "$OPTARG
      s_s=$OPTARG
      ;;
    d)
      echo "this is date arg, -d    "$OPTARG
      s_d=$OPTARG
      ;;
    t)
      echo "this is type arg, -t    "$OPTARG
      s_t=$OPTARG
      ;;
    l)
      echo "this is local dir arg, -l    "$OPTARG
      l_path=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG"
      ;;
    esac
  done

##并发数
#num=$7
#sftp 目录 /qingbo/regulation/20230208/ec/douyin.com

#函数执行入库
#多个日期目录
dateDir=${s_d//,/ }
dateDirs=$dateDir
#开启线程池
concurrentHandle
for currentDir in ${dateDirs[*]}; do
  read -u3
  {
  check_dst_dir currentDir
  download_dir currentDir
  doUnZip
  echo >&3
  }&
  done
  wait
#check_dst_dir
#concurrentHandle
#download_dir
#doUnZip
#执行结束时间
endTime=$(date +%Y%m%d-%H:%M:%S)
endTime_s=$(date +%s)
#执行总时间
sumTime=$(($endTime_s - $startTime_s))

echo "$startTime ---> $endTime" "Total:$sumTime seconds"